package books.in_action.lambda

data class Book(val bookName: String, val author: List<String>)

fun main(args: Array<String>) {

    val intList = listOf(1, 2, 3, 4, 5, 6)

    //过滤并将结果收集到另一个集合中
    intList.filter { it % 2 == 0 }.also(::println)

    //将集合中每一个元素应用到给定函数并将结果收集到另一个集合中
    intList.map { it * it }.also(::println)

    val mapInt = mapOf(0 to "zero", 1 to "one")
    mapInt.filter {
        it.key == 0 || it.value == " "
    }.also(::println)


    val personList = listOf(Person(19, "android"), Person(15, "hello"), Person(22, "world"))
    //any 至少有一个
    personList.any(filterAdult).also(::println)
    //all 全部条件满足
    personList.all(filterAdult).also(::println)
    //多少个元素满足条件  ，比  personList.filter(filterAdult).size更高效
    personList.count(filterAdult).also(::println)
    //查找元素
    personList.find(filterAdult).also(::println)
    personList.findLast(filterAdult).also(::println)

    //将List转换成map  (int,list<Person>)
    personList.groupBy(Person::age).also(::println)

    val stringList = listOf("a", "abz", "bcc")
    stringList.groupBy(String::first).also(::println)

    /**
     * 获取图书馆里的所有作者
     *
     * flapMap  先映射map ,再做平铺 ,得到List
     */
    val library = listOf(Book("百年孤独", listOf("xy", "xxyy")),
            Book("美国大城市的死与生", listOf("xxyy", "xxxxx")))

    library.flatMap { it.author }.toSet().also(::println)

    /**
     * 嵌套集合直接合并
     */
    val listOfList = listOf(listOf("66", "88"), listOf("55", "99","88"))
    listOfList.flatten().toSet().also(::println)

}

val filterAdult = { person: Person -> person.age > 18 }
